its-fine
A collection of escape hatches for React.
As such, you can go beyond React's component abstraction; components are self-aware and can tap into the React Fiber tree. This enables powerful abstractions that can modify or extend React behavior without explicitly taking reconciliation into your own hands.
Table of Contents
Components
FiberProvider
A react-internal Fiber
provider. This component binds React children to the React Fiber tree. Call its-fine hooks within this.
Note: pmndrs renderers like react-three-fiber implement this internally to make use of useContextBridge
, so you would only need this when using hooks inside of react-dom
or react-native
.
import * as ReactDOM from 'react-dom/client'
import { FiberProvider, useFiber } from 'its-fine'
function App() {
const fiber = useFiber()
}
ReactDOM.createRoot(document.getElementById('root')!).render(
<FiberProvider>
<App />
</FiberProvider>,
)
Hooks
Useful React hook abstractions for manipulating and querying from a component. These must be called within a FiberProvider
component.
useFiber
Returns the current react-internal Fiber
. This is an implementation detail of react-reconciler.
import * as React from 'react'
import { type Fiber, useFiber } from 'its-fine'
function Component() {
const fiber: Fiber<null> | undefined = useFiber()
if (fiber) console.log(fiber.type)
}
useContainer
Returns the current react-reconciler container info passed to Reconciler.createContainer
.
In react-dom, a container will point to the root DOM element; in react-three-fiber, it will point to the root Zustand store.
import * as React from 'react'
import { useContainer } from 'its-fine'
function Component() {
const container: HTMLDivElement | undefined = useContainer<HTMLDivElement>()
if (container) console.log(container)
}
useNearestChild
Returns the nearest react-reconciler child instance or the node created from Reconciler.createInstance
.
In react-dom, this would be a DOM element; in react-three-fiber this would be an Instance
descriptor.
import * as React from 'react'
import { useNearestChild } from 'its-fine'
function Component() {
const childRef: React.MutableRefObject<HTMLDivElement | undefined> = useNearestChild<HTMLDivElement>('div')
React.useEffect(() => {
const child = childRef.current
if (child) console.log(child)
}, [])
return <div />
}
useNearestParent
Returns the nearest react-reconciler parent instance or the node created from Reconciler.createInstance
.
In react-dom, this would be a DOM element; in react-three-fiber this would be an instance descriptor.
import * as React from 'react'
import { useNearestParent } from 'its-fine'
function Component() {
const parentRef: React.MutableRefObject<HTMLDivElement | undefined> = useNearestParent<HTMLDivElement>('div')
React.useEffect(() => {
const parent = parentRef.current
if (parent) console.log(parent)
}, [])
}
;<div>
<Component />
</div>
useContextMap
Returns a map of all contexts and their values.
import * as React from 'react'
import { useContextMap } from 'its-fine'
const SomeContext = React.createContext<string>(null!)
function Component() {
const contextMap = useContextMap()
return contextMap.get(SomeContext)
}
useContextBridge
React Context currently cannot be shared across React renderers but explicitly forwarded between providers (see react#17275). This hook returns a ContextBridge
of live context providers to pierce Context across renderers.
Pass ContextBridge
as a component to a secondary renderer to enable context-sharing within its children.
import * as React from 'react'
import * as ReactNil from 'react-nil'
import * as ReactDOM from 'react-dom/client'
import { type ContextBridge, useContextBridge, FiberProvider } from 'its-fine'
function Canvas(props: { children: React.ReactNode }) {
const Bridge: ContextBridge = useContextBridge()
ReactNil.render(<Bridge>{props.children}</Bridge>)
}
const DOMContext = React.createContext<string>(null!)
function Component() {
console.log(React.useContext(DOMContext))
}
ReactDOM.createRoot(document.getElementById('root')!).render(
<FiberProvider>
<DOMContext.Provider value="Hello from react-dom">
<Canvas>
<Component />
</Canvas>
</DOMContext.Provider>
</FiberProvider>,
)
Utils
Additional exported utility functions for raw handling of Fibers.
traverseFiber
Traverses up or down a Fiber
, return true
to stop and select a node.
import { type Fiber, traverseFiber } from 'its-fine'
const parentDiv: Fiber<HTMLDivElement> | undefined = traverseFiber<HTMLDivElement>(
fiber as Fiber,
true,
(node: Fiber<HTMLDivElement | null>) => node.type === 'div',
)